#include <coroutine>
#include <iostream>
#include <cstdint>

// 协程生成器模板
template <typename T>
struct Generator
{
    // 协程Promise类型定义
    struct promise_type
    {
        T current_value; // 当前产生的值

        // 创建生成器对象
        Generator get_return_object()
        {
            return Generator(std::coroutine_handle<promise_type>::from_promise(*this));
        }

        // 初始挂起点（立即暂停）
        std::suspend_always initial_suspend() { return {}; }

        // 最终挂起点（保持挂起以读取最后的值）
        std::suspend_always final_suspend() noexcept { return {}; }

        // 处理co_yield表达式
        std::suspend_always yield_value(T value)
        {
            current_value = value;
            return {};
        }

        // 禁止co_return带值
        void return_void() {}

        // 异常处理
        void unhandled_exception() { std::terminate(); }
    };

    // 协程句柄
    std::coroutine_handle<promise_type> coro_handle;

    // 构造函数
    explicit Generator(std::coroutine_handle<promise_type> h) : coro_handle(h) {}

    // 析构函数
    ~Generator()
    {
        if (coro_handle)
            coro_handle.destroy();
    }

    // 移动构造函数
    Generator(Generator &&other) noexcept : coro_handle(other.coro_handle)
    {
        other.coro_handle = nullptr;
    }

    // 获取当前值
    T value() const
    {
        return coro_handle.promise().current_value;
    }

    // 恢复协程执行
    bool next()
    {
        if (!coro_handle || coro_handle.done())
            return false;
        coro_handle.resume();
        return !coro_handle.done();
    }
};

// 斐波那契数列生成协程
Generator<uint64_t> fibonacci()
{
    uint64_t a = 0, b = 1;
    while (true)
    {
        co_yield a; // 暂停并返回值
        auto next = a + b;
        a = b;
        b = next;
    }
}

int main()
{
    auto fib_gen = fibonacci(); // 创建生成器对象
    for (int i = 0; i < 20; ++i)
    {
        std::cout << fib_gen.value() << " ";
        fib_gen.next(); // 恢复协程执行
    }
}